iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

CMakePackageConfigHelpers 這個工具還具有一個非常方便的功能,可以幫助產生專案的版本文件(xxxConfigVersion.cmake),以便讓find_package指令能夠找到它。
透過使用這個版本文件,開發者可以讓find_package明確指定他們所需的第三方程式庫的版本條件,如果環境中安裝的第三方程式庫版本不符合要求,將會出現錯誤提示,提醒用戶升級或修復庫的版本問題。

語法

write_basic_package_version_file

定義:產生xxxConfigVersion.cmake檔案,讓find_package知道此專案的版本,並且在需求版本與專案版本不同時,做出對應的動作,看是要繼續編譯還是跳出錯誤訊息提醒使用者。

write_basic_package_version_file(
    <filename>
    [VERSION <major.minor.patch>]
    COMPATIBILITY <AnyNewerVersion|SameMajorVersion|SameMinorVersion|ExactVersion>)
filename:輸出名稱,通常為 xxxConfigVersion.cmake。
VERSION:此專案的版本。
COMPATIBILITY AnyNewerVersion:任一版本都相容。
COMPATIBILITY SameMajorVersion:在相同主版本號的情況下相容,這個相容性設定最常見,因為主版本號的變更有很大機率彼此會不相容。
COMPATIBILITY SameMinorVersion:在相同的主版本號與次要版本號相同的情況下相容。
COMPATIBILITY ExactVersion:主版本號、次版本號、補釘版本都相同的情況才能相容。

find_package

定義:尋找所需第三方庫

find_package(<package_name1> 
[major[.minor[.patch[.tweak]]]] [EXACT]
[REQUIRED] 
[[COMPONENTS] name1 name2 ...]
)
[major[.minor[.patch[.tweak]]]]:可以指定單一版本,也可以指定一個範圍(versionMin...[<]versionMax)
EXACT:版本號是否需要完全一致
REQUIRED : 如果找不到該庫,就停止編譯並報錯
COMPONENTS : 該庫所依賴的其他組件

範例

1. 編寫 MathFunctions / CMakeLists.txt

write_basic_package_version_file(
	${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
	VERSION ${PROJECT_VERSION}
	COMPATIBILITY SameMajorVersion
)
# 生成 ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake 文件,讓 find_package 知道這個第三方庫是什麼版本
# 相容性設定為和主要版本號相同

⭐P.S. 可以自行更換不同的相容性設定來看看使用結果
2. 編譯並安裝

$ cd build
$ cmake ..
$ make
$ sudo make install

kai@esoc:~/2023_iT_CMake/Day24/MathFunctions/build$ sudo make install
[100%] Built target mysqrt
Install the project...
-- Install configuration: ""
-- Up-to-date: /usr/local/include/mysqrt.h
-- Up-to-date: /usr/local/lib/libmysqrt.so.1.5.0
-- Up-to-date: /usr/local/lib/libmysqrt.so.1
-- Up-to-date: /usr/local/lib/libmysqrt.so
-- Up-to-date: /usr/local/lib/cmake/MathFunctions/MathFunctionsConfig.cmake <----⭐
-- Up-to-date: /usr/local/lib/cmake/MathFunctions/MathFunctionsConfigVersion.cmake <----⭐

可以注意到,除了 Config.cmake 之外,今天我們多產生了一個名為 Config.cmake 的檔案,這個檔案通常包含了此專案的版本相關設定。
3. 編寫 Main / CMakeLists.txt

find_package(MathFunctions 1.0.0 REQUIRED)
# 尋找版本為 1.0.0 的 MathFunctionsConfig.cmake,REQUIRED 將其設定為必要項目,若找不到則會報錯

4. 編譯與執行

$ cd Main/build
$ cmake ..

kai@esoc:~/2023_iT_CMake/Day24/Main/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- MathFunctions_FOUND: 1
-- MathFunctions_INCLUDE_DIRS: /usr/local/include
-- MathFunctions_LIBRARY_DIRS: /usr/local/lib
-- MathFunctions_LIBS: mysqrt
-- MathFunctions_VERSION: 1.5.0    <----- 找到庫的版本號⭐
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kai/2023_iT_CMake/Day24/Main/build

$ make
$ ./main 10

  • 如果 MathFunctions 專案版本為1.5.0,相容性設定為和主版本號相同 SameMajorVersion ,Main 專案要求 1.0.0版本,可以正常編譯
  • 如果 MathFunctions 專案版本為1.5.0,相容性設定為和主版本號相同 SameMajorVersion ,Main 專案要求 1.6.0版本,不能正常編譯,會出現以下錯誤。
kai@esoc:~/2023_iT_CMake/Day24/Main/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:6 (find_package):
  Could not find a configuration file for package "MathFunctions" that is
  compatible with requested version "1.6.0".

  The following configuration files were considered but not accepted:

    /usr/local/lib/cmake/MathFunctions/MathFunctionsConfig.cmake, version: 1.5.0



-- Configuring incomplete, errors occurred!
See also "/home/kai/2023_iT_CMake/Day24/Main/build/CMakeFiles/CMakeOutput.log".

上一篇
[Day 23] 製作第三方庫(二)
下一篇
[Day25] 使用第三方庫--以Glog為例
系列文
建構屬於自己的C/C++專案 : 我的30天CMake學習之旅29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言